package monopoli.game;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import monopoli.Monopoli;

public class Mazzo {
    
    public static int TIPO_POSSEDIMENTO = 1;
    public static int TIPO_PROBABILITA = 2;
    public static int TIPO_IMPREVISTI = 3;

    private ArrayList<Carta> mazzoCarte;

    public Mazzo () {
    }

    public ArrayList<Carta> getMazzoCarte () {
        return mazzoCarte;
    }

    public void setMazzoCarte (ArrayList<Carta> val) {
        this.mazzoCarte = val;
    }
    
    //tipo = 1 mazzo carte possedimento
    //tipo = 2 mazzo carte probabilità
    //tipo = 3 mazzo imprevisti
    public void inizializzaMazzo(int tipo) {
        
       
        ArrayList<Carta> mc = new ArrayList<Carta>();
        
        
        if (tipo == Mazzo.TIPO_POSSEDIMENTO ) {
           
        //VICOLO CORTO
        Proprieta c2 = new Proprieta();
        c2.setId(2);
        c2.setNome("corto");
        c2.setNomeEsteso("Vicolo Corto");
        //c2.setProprietario(13);
        mc.add(c2);

               
        //VICOLO STRETTO
        Proprieta c4 = new Proprieta();
        c4.setId(4);
        c4.setNome("stretto");
        c4.setNomeEsteso("Vicolo Stretto");
        //c4.setProprietario(13);
        mc.add(c4);
        
        //Proprieta SUD
        Proprieta c6 = new Proprieta();
        c6.setId(6);
        c6.setNome("sud");
        c6.setNomeEsteso("Stazione Sud");
        //c6.setProprietario(13);
        mc.add(c6);
        
        //BASTIONI GRAN SASSO
        Proprieta c7 = new Proprieta();
        c7.setId(7);
        c7.setNome("sasso");
        c7.setNomeEsteso("Bastioni Gran Sasso");
        //c7.setProprietario(13);
        mc.add(c7);
                
        //VIALE MONTEROSA
        Proprieta c9 = new Proprieta();
        c9.setId(9);
        c9.setNome("monterosa");
        c9.setNomeEsteso("Viale Monterosa");
        //c9.setProprietario(13);
        mc.add(c9);
        
        //VIALE VESUVIO
        Proprieta c10 = new Proprieta();
        c10.setId(10);
        c10.setNome("vesuvio");
        c10.setNomeEsteso("Viale Vesuvio");
        mc.add(c10);
        
        //VIA ACCADEMIA
        Proprieta c12 = new Proprieta();
        c12.setId(12);
        c12.setNome("accademia");
        c12.setNomeEsteso("Via Accademia");
        mc.add(c12);
        
        //Proprieta' ELETTRICA
        Proprieta c13 = new Proprieta();
        c13.setId(13);
        c13.setNome("elettrica");
        c13.setNomeEsteso("Società Elettrica");
        mc.add(c13);
        
        //CORSO ATENEO
        Proprieta c14 = new Proprieta();
        c14.setId(14);
        c14.setNome("ateneo");
        c14.setNomeEsteso("Corso Ateneo");
        mc.add(c14);
        
        //PIAZZA UNIVERSITA'
        Proprieta c15 = new Proprieta();
        c15.setId(15);
        c15.setNome("universita");
        c15.setNomeEsteso("Piazza Università");
        mc.add(c15);
        
        //Proprieta OVEST
        Proprieta c16 = new Proprieta();
        c16.setId(16);
        c16.setNome("ovest");
        c16.setNomeEsteso("Stazione Ovest");
        mc.add(c16);
        
        //VIA VERDI
        Proprieta c17 = new Proprieta();
        c17.setId(17);
        c17.setNome("verdi");
        c17.setNomeEsteso("Via Verdi");
        mc.add(c17);
        
        //CORSO RAFFAELLO
        Proprieta c19 = new Proprieta();
        c19.setId(19);
        c19.setNome("raffaello");
        c19.setNomeEsteso("Corso Raffaello");
        mc.add(c19);
        
        //PIAZZA DANTE
        Proprieta c20 = new Proprieta();
        c20.setId(20);
        c20.setNome("dante");
        c20.setNomeEsteso("Piazza Dante");
        mc.add(c20);
        
        //VIA MARCO POLO
        Proprieta c22 = new Proprieta();
        c22.setId(22);
        c22.setNome("polo");
        c22.setNomeEsteso("Via Marco Polo");
        mc.add(c22);
                
        //CORSO MAGELLANO
        Proprieta c24 = new Proprieta();
        c24.setId(24);
        c24.setNome("magellano");
        c24.setNomeEsteso("Corso Magellano");
        mc.add(c24);
        
        //LARGO COLOMBO
        Proprieta c25 = new Proprieta();
        c25.setId(25);
        c25.setNome("colombo");
        c25.setNomeEsteso("Largo Colombo");
        mc.add(c25);
        
        //Proprieta NORD
        Proprieta c26 = new Proprieta();
        c26.setId(26);
        c26.setNome("nord");
        c26.setNomeEsteso("Stazione Nord");
        mc.add(c26);
        
        //VIALE COSTANTINO
        Proprieta c27 = new Proprieta();
        c27.setId(27);
        c27.setNome("costantino");
        c27.setNomeEsteso("Viale Costantino");
        mc.add(c27);
        
        //VIALE TRAIANO
        Proprieta c28 = new Proprieta();
        c28.setId(28);
        c28.setNome("traiano");
        c28.setNomeEsteso("Viale Traiano");
        mc.add(c28);
        
        //Proprieta' ACQUA POTABILE
        Proprieta c29 = new Proprieta();
        c29.setId(29);
        c29.setNome("potabile");
        c29.setNomeEsteso("Società Acqua Potabile");
        mc.add(c29);
        
        //PIAZZA GIULIO CESARE
        Proprieta c30 = new Proprieta();
        c30.setId(30);
        c30.setNome("cesare");
        c30.setNomeEsteso("Piazza Giulio Cesare");
        mc.add(c30);
        
        //VIA ROMA
        Proprieta c32 = new Proprieta();
        c32.setId(32);
        c32.setNome("roma");
        c32.setNomeEsteso("Via Roma");
        mc.add(c32);
        
        //CORSO IMPERO
        Proprieta c33 = new Proprieta();
        c33.setId(33);
        c33.setNome("impero");
        c33.setNomeEsteso("Corso Impero");
        mc.add(c33);
               
        //LARGO AUGUSTO
        Proprieta c35 = new Proprieta();
        c35.setId(35);
        c35.setNome("augusto");
        c35.setNomeEsteso("Largo Augusto");
        mc.add(c35);
        
        //Proprieta EST
        Proprieta c36 = new Proprieta();
        c36.setId(36);
        c36.setNome("est");
        c36.setNomeEsteso("Stazione Est");
        mc.add(c36);
        
        //VIALE DEI GIARDINI
        Proprieta c38 = new Proprieta();
        c38.setId(38);
        c38.setNome("giardini");
        c38.setNomeEsteso("Viale Dei Giardini");
        mc.add(c38);
        
        //PARCO DELLA VITTORIA
        Proprieta c40 = new Proprieta();
        c40.setId(40);
        c40.setNome("vittoria");
        c40.setNomeEsteso("Parco Della Vittoria");
        mc.add(c40);  
        
            
            
            
            
        }
        
        if (tipo == Mazzo.TIPO_PROBABILITA) {
            int counter = 1;
            CartaProbabilita p;
            while(counter <11) {
                p = new CartaProbabilita(counter);
                p.setId(counter);
                p.setNome("probabilita" + counter);
                p.setNomeEsteso("Probabilità");
                mc.add(p);
                counter++;
            }
        }
        
        if (tipo == Mazzo.TIPO_IMPREVISTI) {
            int counter = 1;
            CartaImprevisto i;
            while(counter <11) {
                i = new CartaImprevisto(counter);
                i.setId(counter);
                i.setNome("imprevisto" + counter);
                i.setNomeEsteso("Imprevisto");
                mc.add(i);
                counter++;
            }
        }
        
        setMazzoCarte(mc);
    }
   
    public Carta getCarta(int id) {
        Iterator it =mazzoCarte.iterator();
        while(it.hasNext()) {
            Carta c = (Carta)it.next();
            if (c.getId() == id) 
                    return c;
        }
        return null;
    }

    public int getNumeroCarte() {
        return mazzoCarte.size();
    }
    
   
    
    public void stampaMazzo() {
        Iterator it = mazzoCarte.iterator();
        String s = new String();
        while(it.hasNext()) {
             s = new String("[DBG_game] ");

            Carta c = (Carta) it.next();
            
            if(c instanceof Carta) {
                s = s.concat(" Carta ");
            }
            
            if(c instanceof CartaImprevisto) {
                s = s.concat(" Imprevisto");
            }
            
            if(c instanceof CartaProbabilita) {
                s = s.concat(" Probabilità");
            }
           
            if(c instanceof Proprieta) {
                s = s.concat(" Proprietà di " + ((Proprieta)c).getProprietario());
            }
            
            
            Monopoli.getMonopoliGUI().debugMessage(s + " Id: " + c.getId() + " Nome: " + c.getNome() + " Nome esteso: " + c.getNomeEsteso());
        }
                
    }
    
    public ArrayList<Carta> getCarteMazzo(int amount) {
        //Se il mazzo è un mazzo possedimento e le carte
        //sono già state tutte assegnate torno NULL

        int value = 0;
        ArrayList<Carta> carte = new ArrayList<Carta>();
        Iterator it = mazzoCarte.iterator();
        Carta c;
        while(it.hasNext() && (value < amount) ) {

            c =(Carta)it.next();
            if(c instanceof Proprieta) {
                if (((Proprieta)c).getProprietario() == 0) {
                    carte.add(c);
                    value++;
                }
            }

            else {
                carte.add(c);
                value++;
            }

        }
        if (value < amount)
            Monopoli.getMonopoliGUI().debugMessage("[DBG_GAME]: Carte finite, impossibile ottenere ulteriori carte dal mazzo");
        return carte;
    }


    
    
    public void mescola() {
        Collections.shuffle((mazzoCarte));
    }
    
}

